

function kwargs(func, defaults) {
    /*jshint maxlen : 200*/
    var removeComments = new RegExp('(\\/\\*[\\w\\\'\\,\\(\\)\\s\\r\\n\\*]*\\*\\/)|(\\/\\/[\\w\\s\\\'][^\\n\\r]*$)|(<![\\-\\-\\s\\w\\>\\/]*>)', 'gim');
    var removeWhitespc = new RegExp('\\s+', 'gim');
    var matchSignature = new RegExp('function.*?\\((.*?)\\)', 'i');
    // get the argument names from function source
    var names = func.toString().replace(removeComments, '').replace(removeWhitespc, '').match(matchSignature)[1].split(',');
    // Check the existance of default, if not create an object
    if (defaults !== Object(defaults)) {
        defaults = {};
    }
    return function () {
        var args = Array.prototype.slice.call(arguments);
        var kwargs = args[args.length - 1];
        // Check the existance of the kwargs
        if (kwargs && kwargs.constructor === Object) {
            args.pop();
        } else {
            kwargs = {};
        }
        // Fill the arguments and apply them
        for (var i = 0; i < names.length; i++) {
            var name = names[i];
            if (name in kwargs) {
                args[i] = kwargs[name];
            } else if (name in defaults && args[i] == null) {
                args[i] = defaults[name];
            }
        }
        return func.apply(this, args);
    };
}
module.exports = kwargs || module.exports;;